﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TechControl.BD;
using System.Data.SqlClient;
using System.Collections;

namespace TechControl.Presentation
{
    public partial class frm_atribuirEquipamento : frm_default
    {
        BindingSource bs = new BindingSource();
        Int64 codEquip = 0;

        public frm_atribuirEquipamento()
        {
            InitializeComponent();
        }
        
        //sai da operação.
        private void bt_sair_Click(object sender, EventArgs e)
        {
            this.closeForm();
        }

        //verifica se funcionário existe, se sim busca seu nome.
        private void txt_codFuncionario_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                if (txt_codFuncionario.Text == "")
                {
                    MessageBox.Show("Insira um código de Funcionário para continuar!", "Código de funcionário");
                    txt_codFuncionario.Focus();
                }
                else
                {
                    lbl_nome.Text = "";
                    lbl_rg.Text = "";
                    Int64 cod = Int64.Parse(txt_codFuncionario.Text.Trim());
                    //recebe o nome e o rg do funcionário.
                    string nomecomposto = FuncionarioDB.getInstance().selectNameByCod(cod);
                    string[] sepNome = nomecomposto.Split('=');
                    string nome = sepNome[0].ToString();
                    string rg = sepNome[1].ToString();

                    if (nome == "" || nome == null)
                    {
                        MessageBox.Show("Código de funcionário inválido, insira um código válido para continuar!","Atribuir Equipamento");
                        txt_codFuncionario.Text = "";
                        txt_codFuncionario.Focus();
                    }
                    else
                    {
                        lbl_nome.Text = nome;
                        lbl_rg.Text = rg;
                        sourceForItems(cod);
                        txt_serial.Focus();
                    }
                }
            }
        }

        //limpa os campos e set cursor em codigo de funcionário.
        private void clear()
        {
            txt_codFuncionario.Text = "";
            lbl_nome.Text = "";
            txt_serial.Text = "";
            txt_imei.Text = "";
            lbl_marca.Text = "";
            lbl_modelo.Text = "";
            txt_descricao.Text = "";
            txt_codFuncionario.Focus();
            lbl_pat.Text = "";
            lbl_emp.Text = "";
            lbl_rg.Text = "";
            codEquip = 0;
        }

        //chama método  que efetua a limpesa.
        private void bt_limpar_Click(object sender, EventArgs e)
        {
            clear();
            sourceForItems(0);
        }

        //busca por items na base (TB_ITEM_ATRIBUIDO) pertencente ao usuário selecionado.
        private void sourceForItems(Int64 codFunc)
        {
            BaseDB ba = new BaseDB();
            try
            {
                ba.open();

                SqlCommand command = new SqlCommand("Select * from tb_item_atribuido where id_funcionario = '"+codFunc+"';", ba.conn);
                //cria um adapter para preencher um data set.
                SqlDataAdapter da = new SqlDataAdapter(command);
                //define um objeto dataSet
                DataSet ds = new DataSet();
                da.Fill(ds);

                //atribui o dataset ao DataSource do BindingSource
                bs.DataSource = ds;

                //atribui o BindingSource ao BindingNavigator
                bs.DataMember = ds.Tables[0].TableName;

                //Atribui o BindingSource ao DataGridView
                dg_itemAtribuido.DataSource = bs;
            }
            catch (Exception)
            {
                MessageBox.Show("Funcionário não possuí nenhum equipamento em posse!", "Atribuir Item");
            }
            finally
            {
                ba.close();
            }
        }

        //busca por informações do Equipamento de acordo com serial.
        private void txt_serial_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                callValuesBySerial();
            }
        }

        //busca por informações do Equipamento de acordo com imei.
        private void txt_imei_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                callValuesByIMEI();
            }
        }

        //busca informação sobre equipamento de acordo com serial informado.
        private void callValuesBySerial()
        {
            string serial = txt_serial.Text;
            
            
            if (!EquipamentoDB.getInstance().verificaEquipBySerial(serial))
            {
                var resposta = MessageBox.Show("Equipamento não existe na base de dados, desejar cadastralo?", "Equipamento", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (resposta == DialogResult.Yes)
                {
                    frm_cadEquipamento cadEquipamento = new frm_cadEquipamento(null);
                    cadEquipamento.showForm(this);
                }
                else
                {
                    txt_serial.Text = "";
                    txt_serial.Focus();
                }
            }
            else
            {
                Equipamento result = (Equipamento)EquipamentoDB.getInstance().selectBySerial(serial)[0];
                txt_imei.Text = result.imei;
                lbl_marca.Text = result.marca;
                lbl_modelo.Text = result.modelo;
                txt_descricao.Text = result.descModelo;
                codEquip = result.codEquipamento;
                lbl_pat.Text = result.pat;
                lbl_empresa.Text = result.empresa;
            }
        }

        //busca informação sobre equipamento de acordo com serial informado.
        private void callValuesByIMEI()
        {
            string imei = txt_imei.Text;


            if (!EquipamentoDB.getInstance().verificaEquipByIMEI(imei))
            {
                var resposta = MessageBox.Show("Equipamento não existe na base de dados, desejar cadastralo?", "Equipamento", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (resposta == DialogResult.Yes)
                {
                    frm_cadEquipamento cadEquipamento = new frm_cadEquipamento(null);
                    cadEquipamento.showForm(this);
                }
                else
                {
                    txt_imei.Text = "";
                    txt_imei.Focus();
                }
            }
            else
            {
                Equipamento result = (Equipamento)EquipamentoDB.getInstance().selectByIMEI(imei)[0];
                txt_serial.Text = result.serial;
                lbl_marca.Text = result.marca;
                lbl_modelo.Text = result.modelo;
                txt_descricao.Text = result.descModelo;
                codEquip = result.codEquipamento;
                lbl_pat.Text = result.pat;
                lbl_empresa.Text = result.empresa;
            }
        }

        //chama método que efetua a atribuição do equipamento.
        private void bt_atribuir_Click(object sender, EventArgs e)
        {
            insertNewAtribuicao();
        }

        //efetua atribuição (insert na tabela de item_atribuído).
        private void insertNewAtribuicao()
        {
            Int64 codItem = Int64.Parse(txt_codItemAtribuido.Text);
            Int64 codFunc = Int64.Parse(txt_codFuncionario.Text);
            string nomeFunc = lbl_nome.Text;
            string serial = txt_serial.Text;
            string imei = txt_imei.Text;
            string marca = lbl_marca.Text;
            string modelo = lbl_modelo.Text;
            string desc = txt_descricao.Text;
            string data = DateTime.Now.ToString("dd/MM/yyyy");
            string rgFunc = lbl_rg.Text;
            string pat = lbl_pat.Text;
            string empresa = lbl_empresa.Text;

            if (Item_AtrinuidoDB.getInstance().insertNewAtribuicao(codItem, codFunc, nomeFunc, codEquip, serial, imei, marca, modelo, desc, data, rgFunc,
                pat, empresa))
            {
                MessageBox.Show("Equipamento atribuido com sucesso!", "Atribuição de Equipamento");
                clear();
                sourceForItems(0);
                getLastIDInserido();
            }

            else
            {
                MessageBox.Show("Erro ao atribuir Equipamento, cheque os calores ou contate o suporte!", "Atribuição de Equipamento");
            }
        }

        //carrega proximo registro a ser inserido.
        private void frm_atribuirEquipamento_Load(object sender, EventArgs e)
        {
            getLastIDInserido();
        }

        //pega ultimo registro inserido no bando e adiciona +1.
        private void getLastIDInserido()
        {
            txt_codItemAtribuido.Text = "";
            Int64 id = Item_AtrinuidoDB.getInstance().getLastIDInserido();
            id++;
            txt_codItemAtribuido.Text = id.ToString();
        }

        //chama o método que imprimi o termo de responsabilidade.
        private void bt_imprimirTermo_Click(object sender, EventArgs e)
        {
            Int64 cod = Int64.Parse(dg_itemAtribuido.CurrentRow.Cells[0].Value.ToString());

            preencherTermo(cod);
        }

        //busca os valores do item selecionado e preenche o termo.
        private void preencherTermo(Int64 cod)
        {
            Item_Atribuido result = (Item_Atribuido)Item_AtrinuidoDB.getInstance().selectByCod(cod)[0];

            string matriz = Application.StartupPath + "\\RESPONSABILIDADE.doc";


            string nome = result.nome;
            string rg = result.rg;
            string date = DateTime.Now.ToString("dd/MM/yyyy");
            string equip = result.descModelo;
            string marca = result.marca;
            string modelo = result.modelo;
            string pat = result.pat;
            string empresa = result.empresa;
            string serial = result.serial;
            string imei = result.imei;
            string dia = DateTime.Now.ToString("dd");
            string ano = DateTime.Now.ToString("yyyy");

            try
            {
                GeraTermos.getInstance().preencherResponsabilidade(matriz, nome, rg, date, equip, marca, modelo, pat, empresa, serial, imei, dia, ano);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }
}
